package main

import (
	"fmt"
	"knowledge-go/cpt/c_000_com"
	"reflect"
)

/*
接口类型是一种抽象的类型。它不会暴露出它所代表的对象的内部值的结构和这个对象支持的基础操作的集合,只会表现出它们自己的方法。
也就是说当你有看到一个接口类型的值时，你不知道它是什么，唯一知道的就是可以通过它的方法来做什么。
*/
func main() {
	// 接口的类型判断
	d1Test01(1)
	d1Test01(1.1)
	d1Test01("a")
	d1Test01([]int{1})
	d1Test01([1]int{1})
	d1Test01(c_000_com.User{Id: 1, Name: "张三"})
}

func d1Test01(obj interface{}) {
	var t reflect.Type = reflect.TypeOf(obj)
	var v reflect.Value = reflect.ValueOf(obj)
	fmt.Printf("type=%v, value=%v, ", t, v)

	var info string = "类型未知"
	if v.Kind() == reflect.Slice {
		info = "Slice"
	} else if v.Kind() == reflect.Int {
		info = "Int"
	} else if v.Kind() == reflect.Float64 {
		info = "Float64"
	} else if v.Kind() == reflect.Struct {
		info = "Struct"
	} else if v.Kind() == reflect.Array {
		info = "Array"
	} else if v.Kind() == reflect.String {
		info = "String"
	}

	fmt.Printf("比对类型%s \n", info)
}
